Stored Procedures হল পূর্বনির্ধারিত SQL কোডের ব্লক যা ডেটাবেসে সংরক্ষিত থাকে এবং যেগুলি সাধারণত ডেটাবেস অপারেশন (যেমন INSERT, UPDATE, DELETE, SELECT) সম্পাদন করার জন্য ব্যবহার করা হয়। NHibernate এ Stored Procedures ব্যবহার করে ডেটাবেসের সাথে কাজ করার জন্য Entity Mapping করতে হলে কিছু কনফিগারেশন ও কৌশল অনুসরণ করতে হয়।
NHibernate দ্বারা Stored Procedure থেকে Entity Mapping করার জন্য দুইটি প্রধান পদ্ধতি রয়েছে:
- Native SQL Queries ব্যবহার করা
- Stored Procedure Call এর মাধ্যমে Entity Return করা
1. Native SQL Queries ব্যবহার করে Stored Procedure থেকে Entity Mapping করা
Native SQL Queries ব্যবহার করে আপনি সরাসরি ডেটাবেসে থাকা Stored Procedure কল করতে পারেন এবং তার ফলাফলকে NHibernate Entity তে ম্যাপ করতে পারেন।
Example:
ধরা যাক, আমাদের একটি Employee টেবিল আছে এবং একটি Stored Procedure আছে যা সমস্ত Employee রেকর্ড ফেচ করবে।
Stored Procedure (SQL):
CREATE PROCEDURE GetAllEmployees
AS
BEGIN
SELECT EmployeeID, Name, Position FROM Employees
END
এখন, NHibernate ব্যবহার করে এই Stored Procedure থেকে ডেটা লোড করব।
1.1 Entity Class
public class Employee
{
public virtual int EmployeeId { get; set; }
public virtual string Name { get; set; }
public virtual string Position { get; set; }
}
1.2 Native SQL Query দিয়ে Stored Procedure কল করা
using (var session = sessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("EXEC GetAllEmployees")
.AddEntity(typeof(Employee)); // Mapping the result to Employee entity
var employees = query.List<Employee>();
foreach(var employee in employees)
{
Console.WriteLine($"ID: {employee.EmployeeId}, Name: {employee.Name}, Position: {employee.Position}");
}
}
এখানে:
CreateSQLQueryমেথডের মাধ্যমে আমরা Native SQL কল করছি যা Stored ProcedureGetAllEmployeesএর এক্সিকিউশন করবে।.AddEntity(typeof(Employee))মেথডটি নিশ্চিত করে যে, ফলাফলগুলিEmployeeEntity-তে ম্যাপ করা হবে।.List<Employee>()মেথডের মাধ্যমে, আমরা সেই ফলাফলকেEmployeeঅবজেক্টের তালিকায় পরিণত করছি।
2. Stored Procedure Call দিয়ে Entity Return করা
এছাড়া, আপনি NHibernate-এ Stored Procedure কল করে Entity রিটার্ন করতে পারেন, যেখানে Stored Procedure নিজেই ডেটা রিটার্ন করবে এবং সে ডেটা একটি IList তে রিটার্ন হবে।
Example:
ধরা যাক, একটি Stored Procedure আছে যা নির্দিষ্ট EmployeeId এর উপর ভিত্তি করে একজন Employee রেকর্ড রিটার্ন করবে।
Stored Procedure (SQL):
CREATE PROCEDURE GetEmployeeById @EmployeeId INT
AS
BEGIN
SELECT EmployeeID, Name, Position FROM Employees WHERE EmployeeID = @EmployeeId
END
2.1 Entity Class (যেমন আগে ছিল)
public class Employee
{
public virtual int EmployeeId { get; set; }
public virtual string Name { get; set; }
public virtual string Position { get; set; }
}
2.2 Stored Procedure Call দিয়ে Entity রিটার্ন করা
using (var session = sessionFactory.OpenSession())
{
var query = session.GetNamedQuery("GetEmployeeById")
.SetParameter("EmployeeId", 1); // Pass the parameter for the procedure
var employee = query.UniqueResult<Employee>(); // Getting a single result
if (employee != null)
{
Console.WriteLine($"ID: {employee.EmployeeId}, Name: {employee.Name}, Position: {employee.Position}");
}
}
এখানে:
- Stored Procedure কল করার জন্য
GetNamedQueryব্যবহার করা হয়েছে। এটি একটি Named SQL Query কল করে এবং আমরাSetParameterমেথড দিয়ে ইনপুট প্যারামিটার প্রদান করেছি। .UniqueResult<Employee>()মেথডটি এককEmployeeঅবজেক্ট রিটার্ন করে (যেহেতু আমরা একটি নির্দিষ্ট EmployeeId অনুসন্ধান করছি)।
3. Fluent NHibernate ব্যবহার করে Stored Procedure Mapping
যদি আপনি Fluent NHibernate ব্যবহার করতে চান, তবে আপনাকে কিছুটা ভিন্ন কনফিগারেশন করতে হবে।
3.1 Fluent Configuration Example:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Table("Employees");
Id(x => x.EmployeeId);
Map(x => x.Name);
Map(x => x.Position);
}
}
public class StoredProcedureExample
{
public void GetEmployees()
{
using (var session = sessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("EXEC GetAllEmployees")
.AddEntity<Employee>(); // Map result to Employee entity
var employees = query.List<Employee>();
foreach(var employee in employees)
{
Console.WriteLine($"ID: {employee.EmployeeId}, Name: {employee.Name}, Position: {employee.Position}");
}
}
}
}
4. Stored Procedure Return Value Map করা
যদি Stored Procedure একাধিক কলাম বা রিটার্ন ভ্যালু ফেরত দেয় এবং আপনি সেই ভ্যালুগুলোকে একাধিক Entity বা Value Types এ ম্যাপ করতে চান, তখন NHibernate এ .AddScalar() ব্যবহার করে সেই মানগুলো ম্যাপ করতে পারেন।
Example:
using (var session = sessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("EXEC GetEmployeeDetails @EmployeeId")
.AddScalar("EmployeeId", NHibernate.Util.Int32)
.AddScalar("Name", NHibernate.Util.String)
.AddScalar("Position", NHibernate.Util.String);
var result = query.SetParameter("EmployeeId", 1).List<object[]>();
foreach (var record in result)
{
var employeeId = (int)record[0];
var name = (string)record[1];
var position = (string)record[2];
Console.WriteLine($"ID: {employeeId}, Name: {name}, Position: {position}");
}
}
এখানে:
.AddScalar()মেথডটি ব্যবহার করে আমরা প্রত্যেক কলামকে সঠিক টাইপে ম্যাপ করছি।List<object[]>এর মাধ্যমে আমরা Stored Procedure থেকে আসা ডেটাকে অ্যারে হিসেবে সংগ্রহ করছি এবং তারপরে সেই ডেটা দিয়ে প্রাসঙ্গিক কাজ করছি।
উপসংহার
NHibernate এ Stored Procedure থেকে Entity Mapping করার মাধ্যমে, আপনি ডেটাবেসের অভ্যন্তরে থাকা জটিল লজিক এবং কোয়েরিগুলি আপনার অ্যাপ্লিকেশনে সহজভাবে ব্যবহৃত করতে পারেন। এটা পারফরম্যান্স উন্নত করতে সহায়তা করে, কারণ Stored Procedure সাধারণত ডেটাবেসে দ্রুত এক্সিকিউট হয় এবং এটি ডেটাবেস সার্ভারে লজিক প্রক্রিয়াজাত করে।
Read more